/**
 * 
 */
package iut2.sponsor.client;

import java.util.ArrayList;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteEvent;
import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteHandler;

/**
 * Vue gerant l'ajout des sponsors dans l'application
 */
public class VueAjoutSponsor extends Vue {

	private VerticalPanel panel              = new VerticalPanel();
	
	private Label         titre              = new Label();
	
	private TextBox       nom                = new TextBox();
	private TextBox       adresse            = new TextBox();
	
	private MyFileUpload  logoUpload         = new MyFileUpload(this);
	private FormPanel     uploadForm         = new FormPanel();
	
	private Grid          gridForm           = new Grid(7,3);
	private VerticalPanel panelLots          = new VerticalPanel();
	private VerticalPanel panelListeLots     = new VerticalPanel();
	private TextBox       lot1               = new TextBox();
	private Button        moreLotsButton     = new Button();
	private Button        lessLotsButton     = new Button();
	private VerticalPanel panelMontant       = new VerticalPanel();
	private Grid          gridSmileMontant   = new Grid(1,1);
	private Grid          gridMontant        = new Grid(1,3);
	private Grid          gridNom            = new Grid(1,2);
	private Grid          gridAdresse        = new Grid(1,2);
	private Grid          gridLogo           = new Grid(1,2);
	private Grid          gridLot            = new Grid(1,2);
	private Grid          plusMoinsGrid      = new Grid(1,3);
	private TextBox       montant            = new TextBox();
	private Button        validLotButton     = new Button(lang.creerLot());
	private Button        validMontantButton = new Button(lang.creerMont());
	
	/**
	 * ImageBundle de l'application
	 */
	private JoyeuseImageBundle imB = Iut2sponsor.SINGLETON.getImB(); 
	
	private Sponsor newSp;
	
	/**
	 * Constructeur affichant le titre de la vue
	 */
	public VueAjoutSponsor() {
		titre.setText(lang.ajoutSponsor());
		titre.setStyleName("titre");
		panel.add(titre);
	}

	/**
	 * @return le panel contenant la vue
	 */
	@Override
	public Widget getPanel() {
		createClickHandlers();
		
		validLotButton.setEnabled(false);
		validMontantButton.setEnabled(false);
		
		// on associe un service au formulaire
		uploadForm.setAction(GWT.getModuleBaseURL() + "UploadFileServlet");
		uploadForm.setEncoding(FormPanel.ENCODING_MULTIPART);
		uploadForm.setMethod(FormPanel.METHOD_POST);
		
		gridForm.addStyleName("grilleSponsor");
		panelLots.setWidth("315px");
		panelMontant.setWidth("460px");
		
		//ajout des labels
		gridForm.setWidget(0,0,new Label(lang.nameSp()));
		gridForm.setWidget(1,0,new Label(lang.addrSp()));
		gridForm.setWidget(2,0,new Label(lang.logo()));
		gridForm.setWidget(3,0,new Label(lang.lots()));
		Label descLots = new Label(lang.notice());
		descLots.setStyleName("petit");
		gridForm.setWidget(4,0,descLots);
		gridForm.setWidget(3,2,new Label(lang.montant()));
		Label descMontant = new Label(lang.noticeMontant());
		descMontant.setStyleName("petit");
		gridForm.setWidget(4,2,descMontant);
		
		//ajout des champs de texte communs
		montant.setWidth("80px");
		montant.addKeyUpHandler(new KeyUpHandler() { 
				public void onKeyUp(KeyUpEvent event) 
				{
					try {
						int i = Integer.parseInt(montant.getText());
						majSmileyMontant(i);
					} catch (Exception e) {}
				}
			});
		nom.setWidth("160px");
		nom.addKeyUpHandler(new KeyUpHandler() {
			@Override public void onKeyUp(KeyUpEvent event) {
				verifChampsNom(Iut2sponsor.SINGLETON.getSponsors(),true);
				majStatutBoutons();
			}});
		adresse.setWidth("250px");
		adresse.addKeyUpHandler(new KeyUpHandler() {
			@Override public void onKeyUp(KeyUpEvent event) {
				verifChampsAdresse(true);
				majStatutBoutons();
			}});
		gridNom.setWidget(0,0,nom);
		gridForm.setWidget(0,2,gridNom);
		gridAdresse.setWidget(0,0,adresse);
		gridForm.setWidget(1,2,gridAdresse);
		logoUpload.setStyleName("upload");
		
		//ajout du champ d'upload de fichier
		logoUpload.setName("uploadFormElement");
		//on abonne logoUpload aux evenements ONCHANGE et ONCLICK
		DOM.sinkEvents(logoUpload.getElement(),Event.ONCHANGE|Event.ONCLICK);
		uploadForm.setWidget(logoUpload);
		gridLogo.setWidget(0,0,uploadForm);
		
		gridForm.setWidget(2,2,gridLogo);
		
		//ajout du champ d'entree du montant
		gridSmileMontant.setWidget(0,0,imB.smile0().createImage());
		gridSmileMontant.setStyleName("smileMontant");
		panelMontant.add(gridSmileMontant);
		montant.addKeyUpHandler(new KeyUpHandler() {
			@Override public void onKeyUp(KeyUpEvent event) {
				verifChampsMontant(true);
				majStatutBoutons();
			}});
		gridMontant.setWidget(0,0,montant);
		Label monnaie = new Label("€");
		monnaie.setStyleName("euro");
		gridMontant.setWidget(0,1,monnaie);
		panelMontant.add(gridMontant);
		
		//ajout du champ d'entree du premier lot
		lot1.setWidth("150px");
		lot1.addKeyUpHandler(new KeyUpHandler() {
			@Override public void onKeyUp(KeyUpEvent event) {
				verifChampsLots(true);
				majStatutBoutons();
			}});
		panelListeLots.add(lot1);
		
		//grille d'ajout des champs de lots avec les boutons + et -
		lessLotsButton.setEnabled(false); //bouton non cliquable au debut car un seul champ de lot
		moreLotsButton.setSize("20px","20px");
		moreLotsButton.setStyleName("plus");
		lessLotsButton.setSize("20px","20px");
		lessLotsButton.setStyleName("moins2");
		plusMoinsGrid.setWidget(0,2,imB.smile0().createImage());
		plusMoinsGrid.setStyleName("boutonPlusMoins");
		plusMoinsGrid.setWidget(0,0,moreLotsButton);
		plusMoinsGrid.setWidget(0,1,lessLotsButton);
		panelLots.add(plusMoinsGrid);
		gridLot.setWidget(0,0,lot1);
		panelListeLots.add(gridLot);
		panelLots.add(panelListeLots);
		
		gridForm.setWidget(5,0,panelLots);
		gridForm.setWidget(5,2,panelMontant);
		
		//ajout des deux boutons de validation
		gridForm.setWidget(6,0,validLotButton);
		gridForm.setWidget(6,2,validMontantButton);
		
		uploadForm.addSubmitCompleteHandler(new SubmitCompleteHandler() {

			public void onSubmitComplete(SubmitCompleteEvent event) {
				if (!event.getResults().contains("NO-SCRIPT-DATA")) {
					newSp.setLogoUrl(event.getResults());
					sendSponsor(newSp);
				}
			}
		});

		panel.add(gridForm);
		return panel;
	}
	
	/**
	 * Ajoute les click handlers des boutons + et - et des boutons de validation
	 */
	public void createClickHandlers() {		
		moreLotsButton.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				lessLotsButton.setEnabled(true);
				lessLotsButton.setStyleName("moins");
				TextBox lot = new TextBox();
				Grid grid = new Grid(1,2);
				lot.setWidth("150px");
				lot.addKeyUpHandler(new KeyUpHandler() {
					@Override public void onKeyUp(KeyUpEvent event) {
						verifChampsLots(true);
						majStatutBoutons();
					}});
				grid.setWidget(0,0,lot);
				panelListeLots.add(grid);
				//on met le smiley a jour
				majSmileyLots(panelListeLots.getWidgetCount());
			}
		});
		lessLotsButton.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				int nb = panelListeLots.getWidgetCount();
				if (nb>1) panelListeLots.getWidget(nb-1).removeFromParent();
				nb = panelListeLots.getWidgetCount();
				if (nb==1) { //on grise le bouton "-" s'il n'y a plus qu'un champ de lots
					lessLotsButton.setEnabled(false);
					lessLotsButton.setStyleName("moins2");
				}
				//on met le smiley a jour
				majSmileyLots(panelListeLots.getWidgetCount());
			}
		});
		validLotButton.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				creerSponsorLots();
			}
		});
		validMontantButton.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				creerSponsorMontant();
			}
		});
	}
	
	/**
	 * Tente de creer un sponsor lots apres validation du formulaire
	 */
	public void creerSponsorLots() {
		if (verifChampsSponsorLots(true)) {
			try {
				 ArrayList<String> lots = new ArrayList<String>();
				//on ajoute ses lots
				for(int i=0; i < panelListeLots.getWidgetCount(); i++) {
					gridAdresse.getWidget(0,0);
					Grid grid = (Grid)panelListeLots.getWidget(i);
					TextBox text = (TextBox)grid.getWidget(0,0);
					if (!text.getText().isEmpty()) {
						lots.add(text.getText());
					}
				}
				newSp = new SponsorLot(nom.getText(),logoUpload.getFilename(),
						adresse.getText(), lots); //on cree le sponsor

		    	//on envoie l'image
		    	uploadForm.submit();
			} catch (Exception e) {
				//message d'erreur
			    createDialogBox(true,new Sponsor(),e.getMessage());
			}
		}
	}
	
	/**
	 * Tente de creer un sponsor montant apres validation du formulaire
	 */
	public void creerSponsorMontant() {
		if (verifChampsSponsorMontant(true)) {
			try {
				newSp = new SponsorArgent(nom.getText(),logoUpload.getFilename(),
						adresse.getText(),Integer.parseInt(montant.getText()));

		    	//on envoie l'image
		    	uploadForm.submit();
			} catch (Exception e) {
				//message d'erreur
			    createDialogBox(true,new Sponsor(),e.getMessage());
			}
		}
	}
	
	/**
	 * Verifie tous les champs correspondants a la creation d'un sponsor lots et affiche eventuellement des erreurs s'il ne sont pas valides
	 * @param erreurs vrai si on veut afficher les messages d'erreur et faux sinon
	 * @return vrai si tous les champs sont bien remplis et faux sinon
	 */
	public boolean verifChampsSponsorLots(boolean erreurs) {
		boolean retour = verifChampsCommuns(erreurs);
		if (!verifChampsLots(erreurs)) retour = false;
		
		return retour;
	}
	
	/**
	 * Verifie le 1er champ de renseignement de lot offert et affiche eventuellement des erreurs s'il ne sont pas valides
	 * @param erreurs vrai si on veut afficher les messages d'erreur et faux sinon
	 * @return vrai si tous les champs sont bien remplis et faux sinon
	 */
	public boolean verifChampsLots(boolean erreurs) {
		//on efface les eventuelles erreurs deja affichees
		if (erreurs) gridLot.clearCell(0,1);
		
		HorizontalPanel pan = new HorizontalPanel();
		Label erreur = new Label();
		if (lot1.getText().length()<2) { //l'entree est trop courte
			erreur.setText(lang.lotCourt());
			erreur.setStyleName("erreur");
			pan.add(imB.invalide().createImage());
			pan.add(erreur);
			if (erreurs) gridLot.setWidget(0,1,pan);
			return false;
		}
		else { //pas d'erreur
			pan.add(imB.valide().createImage());
			if (erreurs) gridLot.setWidget(0,1,pan);
			return true;
		}
	}
	
	/**
	 * Verifie tous les champs correspondants a la creation d'un sponsor montant et affiche eventuellement des erreurs s'il 
	 * ne sont pas valides
	 * @param erreurs vrai si on veut afficher les messages d'erreur et faux sinon
	 * @return vrai si tous les champs sont bien remplis et faux sinon
	 */
	public boolean verifChampsSponsorMontant(boolean erreurs) {
		boolean retour = verifChampsCommuns(erreurs);
		if (!verifChampsMontant(erreurs)) retour = false;
		
		return retour;
	}
	
	/**
	 * Verifie le champ de renseignement du montant offert et affiche eventuellement des erreurs s'il ne sont pas valides
	 * @param erreurs vrai si on veut afficher les messages d'erreur et faux sinon
	 * @return vrai si tous les champs sont bien remplis et faux sinon
	 */
	public boolean verifChampsMontant(boolean erreurs) {
		//on efface les eventuelles erreurs deja affichees
		if (erreurs) gridMontant.clearCell(0,2);
		HorizontalPanel pan = new HorizontalPanel();
		Label erreur = new Label();
		if (montant.getText().length()<1) { //verification de la longueur
			erreur.setText(lang.montantVide());
			erreur.setStyleName("erreur");
			pan.add(imB.invalide().createImage());
			pan.add(erreur);
			if (erreurs) gridMontant.setWidget(0,2,pan);
			return false;
		}
		else { //verification du fait que l'entree soit bien un nombre
			try {
				int i = Integer.parseInt(montant.getText());
				if (i==0) {
					erreur.setText(lang.erreurDon());
					erreur.setStyleName("erreur");
					pan.add(imB.invalide().createImage());
					pan.add(erreur);
					if (erreurs) gridMontant.setWidget(0,2,pan);
					return false;
				}
				else { //pas d'erreur
					pan.add(imB.valide().createImage());
					if (erreurs) gridMontant.setWidget(0,2,pan);
				}
			}
			catch (Exception e) { //l'entree n'est pas un nombre
				erreur.setText(lang.montantNombre());
				erreur.setStyleName("erreur");
				pan.add(imB.invalide().createImage());
				pan.add(erreur);
				if (erreurs) gridMontant.setWidget(0,2,pan);
				return false;
			}
		}
		return true;
	}
	
	/**
	 * Verifie les champs communs du formulaire pour voir si les entrees sont valide et affiche eventuellement des 
	 * messages d'erreurs sinon.
	 * 
	 * @return vrai si les champs son remplis correctement et faux sinon
	 */
	public boolean verifChampsCommuns(boolean erreurs) {
		Sponsors spon = Iut2sponsor.SINGLETON.getSponsors();
		
		boolean retour = verifChampsNom(spon, erreurs);

		if (!verifChampsAdresse(erreurs)) retour = false;

		if (!verifChampsLogo(erreurs)) retour = false;
		
		return retour;
	}
	
	/**
	 * Verifie le champ du nom pour voir si les entrees sont valide et affiche eventuellement un message d'erreur sinon.
	 * @param spon liste des sponsors enregistres
	 * @return vrai si les champs son remplis correctement et faux sinon
	 */
	public boolean verifChampsNom(Sponsors spon, boolean erreurs) {
		//on efface les eventuelles erreurs deja affichees
		if (erreurs) gridNom.clearCell(0,1);
		Label erreur = new Label();
		HorizontalPanel pan = new HorizontalPanel();
		if (nom.getText().length()<2) { //verification de la longueur de l'entree
			erreur.setText(lang.nomCourt());
			erreur.setStyleName("erreur");
			pan.add(imB.invalide().createImage());
			pan.add(erreur);
			if (erreurs) gridNom.setWidget(0,1,pan);
			return false;
		}
		else if (spon.existe(nom.getText())) { //verification de la non existence du sponsor
			erreur.setText(lang.enregistre(nom.getText()));
			erreur.setStyleName("erreur");
			pan.add(imB.invalide().createImage());
			pan.add(erreur);
			if (erreurs) gridNom.setWidget(0,1,pan);
			return false;
		}
		//pas d'erreur
		pan.add(imB.valide().createImage());
		if (erreurs) gridNom.setWidget(0,1,pan);
		return true;
	}
	
	/**
	 * Verification du champs de l'adresse pour voir si les entrees sont valide et affiche eventuellement un message 
	 * d'erreur sinon.
	 * @return vrai si les champs son remplis correctement et faux sinon
	 */
	public boolean verifChampsAdresse(boolean erreurs) {
		//on efface les eventuelles erreurs deja affichees
		if (erreurs) gridAdresse.clearCell(0,1);
		Label erreur = new Label();
		HorizontalPanel pan = new HorizontalPanel();	
		if (adresse.getText().length()<=10) { //verification de la longueur de l'adresse
			erreur.setText(lang.addrCrout());
			erreur.setStyleName("erreur");
			pan.add(imB.invalide().createImage());
			pan.add(erreur);
			if (erreurs) gridAdresse.setWidget(0,1,pan);
			return false;
		}
		//pas d'erreur
		pan.add(imB.valide().createImage());
		if (erreurs) gridAdresse.setWidget(0,1,pan);
		return true;
	}
	
	/**
	 * Verification du champs du logo pour voir si les entrees sont valide et affiche eventuellement un message 
	 * @return vrai si les champs son remplis correctement et faux sinon
	 */
	public boolean verifChampsLogo(boolean erreurs) {
		//on efface les eventuelles erreurs deja affichees
		if (erreurs) gridLogo.clearCell(0,1);
		Label erreur = new Label();
		HorizontalPanel pan = new HorizontalPanel();
		//verification du champ du logo
		if (logoUpload.getFilename().length()==0) { //verification qu'un fichier a bien ete entre
			erreur.setText(" " + lang.selectFichier());
			erreur.setStyleName("erreur");
			pan.add(imB.invalide().createImage());
			pan.add(erreur);
			if (erreurs) gridLogo.setWidget(0,1,pan);
			return false;
		}
		else if (!logoUpload.getFilename().contains(".jpg") 
				&& !logoUpload.getFilename().contains(".jpeg") 
				&& !logoUpload.getFilename().contains(".png") 
				&& !logoUpload.getFilename().contains(".gif")) { //verification que c'est bien une image
			erreur.setText(" " + lang.selectImage());
			erreur.setStyleName("erreur");
			pan.add(imB.invalide().createImage());
			pan.add(erreur);
			if (erreurs) gridLogo.setWidget(0,1,pan);
			return false;
		}
		//pas d'erreur
		pan.add(imB.valide().createImage());
		if (erreurs) gridLogo.setWidget(0,1,pan);
		return true;
	}
	
	/**
	 * Cree la boite de dialogue confirmant la creation d'un sponsor ou notifiant d'une erreur
	 * @param erreur vrai si il y a une erreur, faux sinon
	 * @param sp sponsor cree
	 * @param message message a afficher en cas d'erreur (description de l'exception levee)
	 */
	 private void createDialogBox(boolean erreur,Sponsor sp, String message) {
		 //On cree la boite de dialogue
		 VerticalPanel panelDialog = new VerticalPanel();
		 final DialogBox dialogBox = new DialogBox();
		 dialogBox.setSize("300px","150px");
		 if (erreur) { 
		    dialogBox.setText(lang.spError());
		    panelDialog.add(new HTML("<br /><p class=\"centre\">" + lang.errDesc(message) + "</p><br />"));
		 }
		 else {
		    dialogBox.setText(lang.confSpTitle());
		    if (sp.getMontant()!=0) panelDialog.add(new HTML("<br /><p class=\"centre\">" + lang.confMtDesc(sp.getName()) + "</p><br />"));
		    else panelDialog.add(new HTML("<br /><p class=\"centre\">" + lang.confLotDesc(sp.getName()) + "</p><br />"));
		 }

		 //on ajoute un bouton de fermeture
		 Button closeButton = new Button(lang.close(),
				 new ClickHandler() {
		 public void onClick(ClickEvent event) {
		         dialogBox.hide();
		         }
		    });
		 panelDialog.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
		 panelDialog.add(closeButton);
		 panelDialog.add(new HTML("<br />"));
		 dialogBox.add(panelDialog);

		 //on affiche
		 dialogBox.setAnimationEnabled(true);
		 dialogBox.center();
		 dialogBox.show();
	 }
	
	/**
	 * Mise a jour du smiley du champ du montant en fonction de la valeur entree
	 * @param montant valeur entree dans le champ du montant
	 */
	public void majSmileyMontant(int montant) {
			if (montant == 666) { gridSmileMontant.setWidget(0,0,imB.smile666().createImage()); }
			else if (montant >=50000) { gridSmileMontant.setWidget(0,0,imB.smile7().createImage()); }
			else if (montant >=10000) { gridSmileMontant.setWidget(0,0,imB.smile6().createImage()); }
			else if (montant >=5000) { gridSmileMontant.setWidget(0,0,imB.smile5().createImage()); }
			else if (montant >=1000) { gridSmileMontant.setWidget(0,0,imB.smile4().createImage()); }
			else if (montant >=500) { gridSmileMontant.setWidget(0,0,imB.smile3().createImage()); }
			else if (montant >=100) { gridSmileMontant.setWidget(0,0,imB.smile2().createImage()); }
			else if (montant >=50) { gridSmileMontant.setWidget(0,0,imB.smile1().createImage()); }
			else {	gridSmileMontant.setWidget(0,0,imB.smile0().createImage()); }
	}
	
	/**
	 * Mise a jour du smiley des champs des lots en fonction du no,bre de champs affiches
	 * @param nb nombre de champs de lots
	 */
	public void majSmileyLots(int nb) {
		if (nb >=40) { plusMoinsGrid.setWidget(0,2,imB.smile7().createImage()); }
		else if (nb >=25) { plusMoinsGrid.setWidget(0,2,imB.smile6().createImage()); }
		else if (nb >=11) { plusMoinsGrid.setWidget(0,2,imB.smile5().createImage()); }
		else if (nb >=7) { plusMoinsGrid.setWidget(0,2,imB.smile4().createImage()); }
		else if (nb >=5) { plusMoinsGrid.setWidget(0,2,imB.smile3().createImage()); }
		else if (nb >=3) { plusMoinsGrid.setWidget(0,2,imB.smile2().createImage()); }
		else if (nb >=2) { plusMoinsGrid.setWidget(0,2,imB.smile1().createImage()); }
		else {  plusMoinsGrid.setWidget(0,2,imB.smile0().createImage()); }
	}
	
	/**
	 * Met a jour le statut des boutons de validation en les rendant disponibles ou non suivant la validite des entrees
	 */
	public void majStatutBoutons() {
		if (verifChampsSponsorLots(false)) validLotButton.setEnabled(true);
		else  validLotButton.setEnabled(false);
		if (verifChampsSponsorMontant(false)) validMontantButton.setEnabled(true);
		else  validMontantButton.setEnabled(false);
	}
	 
	
	/**
     * Ajoute le nouveau sponsor a la liste.
     *
     * @param sp Sponsor a envoyer.
     */
    private void sendSponsor(Sponsor sp) {
        GreetingServiceAsync greetingService = GWT.create(GreetingService.class);
        
        AsyncCallback<String> myMethodCallback = new AsyncCallback<String>() {
            public void onSuccess(String result) {
            	//mise a jour des progressbars du menu
		    	Iut2sponsor.SINGLETON.getMenu().MAJPanelRecolte();
		    	//ajout du sponsor a la liste locale des sponsor
		    	Iut2sponsor.SINGLETON.getSponsors().add(newSp);
		    	//Reinitialisation de la vue
		    	Iut2sponsor.SINGLETON.getContenu().afficherVueAjoutSponsor();
		    	//confirmation
			    createDialogBox(false, newSp, "");
            }

            public void onFailure(Throwable ex) {
                RootPanel.get().add(new HTML(ex.toString()));
            }
        };

        // Envoi du sponsor
        greetingService.addSponsor(sp, myMethodCallback);
    }

}